const dayjs = require('dayjs');
/**
 * 日期时间工具类
 * v1.0 - 使用Day.js替代原时间处理函数
 */

/**
 * 格式化日期
 * @param {string} fmt 格式
 * @param {number} timestamp 时间戳
 */
function time(fmt = '', timestamp = null) {
    if (!fmt) return Math.round(dayjs().getTime() / 1000); // 返回时间戳

    const formatMap = {
        'Y': 'YYYY',
        'M': 'MM',
        'D': 'DD',
        'h': 'HH',
        'm': 'mm',
        's': 'ss'
    };

    // 转换格式
    let dayjsFmt = fmt;
    for (const key in formatMap) {
        dayjsFmt = dayjsFmt.replace(key, formatMap[key]);
    }

    // 处理特殊格式
    if (fmt === 'YMD') dayjsFmt = 'YYYYMMDD';
    if (fmt === 'YMDhms') dayjsFmt = 'YYYYMMDDHHmmss';
    
    return dayjs(timestamp ? timestamp * 1000 : dayjs().valueOf()).format(dayjsFmt);
}

/**
 * 时间戳转时间
 * @param {number} timestamp 时间戳
 * @param {string} fmt 格式
 */
function timestamp2Time(timestamp, fmt = 'Y-M-D h:m:s') {
    if (!timestamp) return '';
    
    let dayjsObj = dayjs(timestamp);
    return time(fmt, Math.floor(timestamp / 1000));
}

/**
 * 获取当前时间戳
 */
function time2Timestamp(date) {
    if (!date) return 0;
    return Math.floor(dayjs(date).valueOf() / 1000);
}

/**
 * 时间戳转相对时间
 * @param {number} timestamp 时间戳
 */
function timestame2Ago(timestamp) {
    if (!timestamp) return '';
    
    const now = Math.floor(dayjs().valueOf() / 1000);
    const diff = now - timestamp;
    
    if (diff < 60) return '刚刚';
    if (diff < 3600) return Math.floor(diff / 60) + '分钟前';
    if (diff < 86400) return Math.floor(diff / 3600) + '小时前';
    if (diff < 86400 * 30) return Math.floor(diff / 86400) + '天前';
    
    return dayjs(timestamp * 1000).format('YYYY-MM-DD');
}

/**
 * 获取日期是星期几
 * @param {string} date 日期字符串
 * @returns 星期x
 */
function week(date) {
    if (!date) return '';
    
    const weekMap = ['日', '一', '二', '三', '四', '五', '六'];
    const weekDay = dayjs(date).day();
    return '星期' + weekMap[weekDay];
}

/**
 * 获取某月第一天时间戳
 * @param {number} timestamp 时间戳
 * @returns 时间戳
 */
function getMonthFirstTimestamp(timestamp = null) {
    const date = timestamp ? dayjs(timestamp * 1000) : dayjs();
    const firstDay = date.startOf('month');
    return Math.floor(firstDay.valueOf() / 1000);
}

/**
 * 获取某月最后一天时间戳
 * @param {number} timestamp 时间戳
 * @returns 时间戳
 */
function getMonthLastTimestamp(timestamp = null) {
    const date = timestamp ? dayjs(timestamp * 1000) : dayjs();
    const lastDay = date.endOf('month');
    return Math.floor(lastDay.valueOf() / 1000);
}

/**
 * 获取某天开始时间戳
 * @param {number} timestamp 时间戳
 */
function getDayFirstTimestamp(timestamp = null) {
    const date = timestamp ? dayjs(timestamp * 1000) : dayjs();
    const startOfDay = date.startOf('day');
    return Math.floor(startOfDay.valueOf() / 1000);
}

/**
 * 获取年龄
 * @param {number} timestamp 出生时间戳 
 */
function getAge(timestamp) {
    if (!timestamp) return '';
    const birthDate = dayjs(timestamp * 1000);
    return dayjs().diff(birthDate, 'year');
}

/**
 * 获取今天开始的最小时间戳 
 */
function getNowMinTimestamp() {
    return getDayFirstTimestamp();
}

/**
 * 简单格式化日期
 * @param {number} timestamp 时间戳
 */
function simpleDate(timestamp = null) {
    const date = timestamp ? dayjs(timestamp * 1000) : dayjs();
    return date.format('YYYY.MM.DD');
}

/**
 * 中文格式化日期
 * @param {number} timestamp 时间戳
 */
function fmtDateCHN(timestamp = null) {
    const date = timestamp ? dayjs(timestamp * 1000) : dayjs();
    return date.format('YYYY年MM月DD日');
}

/**
 * 中文格式化日期
 * @param {number} timestamp 时间戳
 */
function fmtDateCN(timestamp = null) {
    const date = timestamp ? dayjs(timestamp * 1000) : dayjs();
    return date.format('YYYY年MM月DD日');
}

/**
 * 中文格式化日期时间
 * @param {number} timestamp 时间戳
 */
function fmtDateTimeCN(timestamp = null) {
    const date = timestamp ? dayjs(timestamp * 1000) : dayjs();
    return date.format('YYYY年MM月DD日 HH:mm');
}

/**
 * 获取时间剩余
 * @param {number} second 剩余秒数
 */
function getTimeLeft(second) {
    if (!second) return '';
    
    // 由于缺少duration插件，我们使用原生JavaScript计算时间差
    const days = Math.floor(second / 86400);
    const hours = Math.floor((second % 86400) / 3600);
    const minutes = Math.floor((second % 3600) / 60);
    const seconds = second % 60;
    
    if (days > 0)
        return `${days}:${hours}:${minutes}:${seconds}`;
    else if (hours > 0)
        return `${hours}:${minutes}:${seconds}`;
    else if (minutes > 0)
        return `${minutes}:${seconds}`;
    else
        return seconds.format("YYYY-MM-DD HH:mm:ss");
}

module.exports = {
    time,
    timestamp2Time,
    time2Timestamp,
    timestame2Ago,
    week,
    getMonthFirstTimestamp,
    getMonthLastTimestamp,
    getAge,
    getNowMinTimestamp,
    getDayFirstTimestamp,
    simpleDate,
    fmtDateCHN,
    fmtDateCN,
    fmtDateTimeCN,
    getTimeLeft
};